package co.dreamapps.cyk.modelo;

import java.util.*;

public class Cyk
{
    Producciones producciones;
    public String stringMatriz[][];

    public Cyk(String gramatica)
    {
        producciones = new Producciones(gramatica);
    }

   
    public void algoritmoCYK()
    {
        producciones.leerEntradas(true);
        stringMatriz = new String[producciones.arrayStringCadena.size()][producciones.arrayStringCadena.size()];

        for (int i = 0; i < producciones.arrayStringCadena.size(); i++)
        {
            for (int j = 0; j < producciones.arrayStringCadena.size(); j++)
            {
                stringMatriz[i][j] = "";
            }
        }


        for (int i = 0; i < producciones.arrayStringCadena.size(); i++)
        {
            for (int j = 0; j < producciones.arrayProducciones.size(); j++)
            {
                ArrayList arrayTemp = new ArrayList();
                arrayTemp = (ArrayList) producciones.arrayProducciones.get(j);
                if (producciones.arrayStringCadena.get(i).equals(arrayTemp.get(1)))
                {
                    stringMatriz[i][0] = (String) stringMatriz[i][0] + "[" + arrayTemp.get(0) + "]";
                }
            }
        }

        // ij
        for (int filas = 1; filas < producciones.arrayStringCadena.size(); filas++)
        {
          
            for (int col = 0; col < producciones.arrayStringCadena.size() - filas; col++)
            {

                for (int k = 0; k < filas; k++)
                {
                    // A -> BC
                    for (int m = 0; m < producciones.arrayProducciones.size(); m++)
                    {

                        ArrayList prodReglas = new ArrayList();
                        prodReglas = (ArrayList) producciones.arrayProducciones.get(m);

                        if (prodReglas.size() > 2)
                        {
                      
                            if ((!stringMatriz[col + k + 1][filas - k - 1].equals("")) && (!stringMatriz[col][k].equals("")))
                            {
                                if ((stringMatriz[col][k].indexOf((String) prodReglas.get(1)) != -1)
                                        && (stringMatriz[col + k + 1][filas - k - 1].indexOf((String)prodReglas.get(2)) != -1))
                                {
                                    
                                    checkDuplicates(col, filas, prodReglas);
                                }
                            }
                        }
                    }
				}
            }
        }

        imprimirTabla();
        isInGrammar();

    }  
    private void checkDuplicates(int first, int second, ArrayList value1)
    {
        if (stringMatriz[first][second].length() > 0)
        {
            boolean present = false;
            for (int z = 0; z < stringMatriz[first][second].length(); z++)
            {
                if (stringMatriz[first][second].indexOf((String) value1.get(0)) != -1)
                {
                    present = true;
                }
            }

            if (!present)
            {
                stringMatriz[first][second] = stringMatriz[first][second] + "[" + (String) value1.get(0) + "]";
            }
        }
        else
        {
            stringMatriz[first][second] = "[" + (String) value1.get(0) + "]";
        }
    }

    private void imprimirTabla()
    {
		System.out.println();
        System.out.println("==================================Tabla========================================");
        System.out.println("        i=1 ...");
        for (int j = 0; j < producciones.arrayStringCadena.size(); j++)
        {
        	System.out.print("|  j="+(j+1)+": ");
            for (int i = 0; i < producciones.arrayStringCadena.size(); i++)
            {
                if ((stringMatriz[i][j].length() == 0) && (i + j < producciones.arrayStringCadena.size()))
                {
                    stringMatriz[i][j] = "[ ]";
                }
                System.out.print(stringMatriz[i][j] + " - ");
            }
            System.out.println("\n");
        }
        System.out.println("===============================================================================");
    }
    private void isInGrammar()
    {
		if (stringMatriz[0][producciones.arrayStringCadena.size() - 1].indexOf("S") == -1)
		{
			 System.out.println("=================================Resultado=====================================");
			 System.out.println("-La cadena w, NO pertenece a L(G)");
			 System.out.println("===============================================================================");
		}
		else
		{
			System.out.println("=================================Resultado=====================================");
			System.out.println("-La cadena w, pertenece a L(G)");
			System.out.println("===============================================================================\n\n");
		}
    }
}
